package it.traveldream.ManagedBeans;

import it.traveldream.EJB.SBEJBBean;
import it.traveldream.EJB.DTO.EscursioneDTO;

import java.util.ArrayList;
import java.util.Iterator;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import org.primefaces.event.TabChangeEvent;

@ManagedBean(name="escursioneBean")
@SessionScoped
public class EscursioneBean {

	/**
	 * {@link EscursioneDTO} che contiene i dati di una nuova escursione da inserire
	 */
	private EscursioneDTO nuovaEscurione;

	/**
	 * {@link EscursioneDTO} che contiene i dati di filtering per la lista di escursioni caricata dal db.
	 */
	private EscursioneDTO datiFiltro;

	private EscursioneDTO escursioneSelezionata;

	private ArrayList<EscursioneDTO> listaEscursioni;
	private ArrayList<EscursioneDTO> listaEscursioniFiltrate;




	//Variabile necessaria per accedere ai dati del nuovo pacchetto che si vuole inserire
	@ManagedProperty(value="#{pacchettoBean}")
	private PacketBean packBean;


	@EJB
	private SBEJBBean sbejb;

	public EscursioneBean(){
		listaEscursioni = new ArrayList<EscursioneDTO>();
		listaEscursioniFiltrate = new ArrayList<EscursioneDTO>();
		nuovaEscurione = new EscursioneDTO();
		setDatiFiltro(new EscursioneDTO());
		escursioneSelezionata = new EscursioneDTO();
	}


	/**
	 * 
	 * Metodo che carica i dati relativi alle escursioni dal database
	 * 
	 */
	public void caricaEscursioni(){

		listaEscursioni.clear();
		listaEscursioni.addAll(sbejb.getEscursioni());
		listaEscursioniFiltrate.clear();
		listaEscursioniFiltrate.addAll(listaEscursioni);

		HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

		//Verifico se devo filtrare i dati in base alla citta di destinazione
		if(origRequest.getServletPath().contains("new_packet_escursione")){
			datiFiltro = new EscursioneDTO();
			this.datiFiltro.setCitta(packBean.getNuovoPacchetto().getCitta());	//Setto come filtro la citta del nuovo pacchetto

		}
		if(origRequest.getServletPath().contains("edit_packet_escursione")){
			datiFiltro = new EscursioneDTO();
			this.datiFiltro.setCitta(packBean.getPacchettoSelezionato().getCitta());	//Setto come filtro la citta del nuovo pacchetto

		}

		filtraEscursioni();	//Filtro le escursioni (che i dati ci siano oppure no)


	}
	
	/**
	 * 
	 * Metodo che carica i dati relativi alle escursioni dal database
	 * 
	 */
	public void caricaEscursioniCustom(){

		listaEscursioni.clear();
		listaEscursioni.addAll(sbejb.getEscursioni());
		listaEscursioniFiltrate.clear();
		listaEscursioniFiltrate.addAll(listaEscursioni);

		HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

		//Verifico se devo filtrare i dati in base alla citta di destinazione
		if(origRequest.getServletPath().contains("new_packet_escursione")){
			datiFiltro = new EscursioneDTO();
			this.datiFiltro.setCitta(packBean.getNuovoPacchetto().getCitta());	//Setto come filtro la citta del nuovo pacchetto

		}
		if(origRequest.getServletPath().contains("new_packet_alloggio")){
			datiFiltro = new EscursioneDTO();
			this.datiFiltro.setCitta(packBean.getNuovoPacchetto().getCitta());	//Setto come filtro la citta del nuovo pacchetto

		}

		filtraEscursioni();	//Filtro le escursioni (che i dati ci siano oppure no)


	}

	/**
	 * 
	 * Listener utilizzato da Primefaces per caricare i dati delle escursioni
	 * dal DB al momento della selezione della relativa Tab
	 * 
	 */
	public void onTabChange(TabChangeEvent event) { 
		if(event.getTab().getTitle().equalsIgnoreCase("Escursioni"))
			caricaEscursioni();
		else
			System.out.println(event.getTab().getTitle());
	} 


	/**
	 * 
	 * Metodo che aggiunge al database l'escursione con i dati contenuti nella variabile
	 * settata attraverso il metodo setNuovaEscursione
	 */
	public void addEscursione(){
		try {
			sbejb.addEscursione(nuovaEscurione);

			FacesContext.getCurrentInstance().addMessage("create_escursione_growl",
					new FacesMessage( "SUCCESFULLY", "escursione creata correttamente"));

			System.out.println("Dati nuova escursione: \n Citta: "+ nuovaEscurione.getCitta().getName() +
					"\n " + nuovaEscurione.getDescrizione() + "\n prezzo: " + nuovaEscurione.getPrezzo()
					);
			nuovaEscurione = new EscursioneDTO(); //Elimino i dati dell'escursiona appena inserita dai fields dei form
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage("create_escursione_growl",
					new FacesMessage( "ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			System.out.print(e.getMessage());
		}


	}

	/**
	 * Metodo utilizzato per filtrare le escursioni dalla lista
	 * delle escursioni del db
	 * 
	 */
	public void filtraEscursioni(){

		listaEscursioniFiltrate.clear();
		if(datiFiltro.getCitta() != null && datiFiltro.getCitta().getName().length() > 0){
			Iterator<EscursioneDTO> it = listaEscursioni.iterator();
			EscursioneDTO e;
			while (it.hasNext()) {
				e = it.next();
				if(e.getCitta().getId() == datiFiltro.getCitta().getId())
					listaEscursioniFiltrate.add(e);
			}
		}else{
			/*alla lista delle escursioni filtrate aggiungo tutte le escursioni, 
			 * in modo che se non c'�� alcun filtro sulla citta, vedo tutte le escursioni
			 */
			listaEscursioniFiltrate.addAll(listaEscursioni);	
		}
	}



	/**
	 * Metodo che permette di modificare i dati di un'escursione gi�� esistente.
	 * I dati dell'escursione da modificare si trovano nel {@link EscursioneDTO} escursioneSelezionata.
	 * 
	 */
	public void editEscursione(){

		try {

			sbejb.updateEscursione(escursioneSelezionata);

			FacesContext.getCurrentInstance().addMessage("edit_escursione_growl",
					new FacesMessage( "SUCCESFULLY", "Escursione modificata correttamente"));

			//TODO Decidere se eliminare i dati del nuovo alloggio da alloggio selezionato oppure no.

		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage("edit_escursione_growl",
					new FacesMessage(FacesMessage.SEVERITY_ERROR ,"ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			System.out.print(e.getMessage());
		}
	}

	
	/**
	 * Metodo che permette di eliminare un'escursione i cui dati si trovano
	 * nell'escursioneDTO escursione selezionata
	 */
	public void deleteEscursione(){
		try {

			sbejb.deleteEscursione(escursioneSelezionata);
			FacesContext.getCurrentInstance().addMessage("delete_escursione_growl",
					new FacesMessage( "SUCCESFULLY", "Escursione eliminata correttamente"));


		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage("delete_escursione_growl",
					new FacesMessage(FacesMessage.SEVERITY_ERROR ,"ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			System.out.print(e.getMessage());
		}
	}

	public EscursioneDTO getNuovaEscurione() {
		return nuovaEscurione;
	}


	public void setNuovaEscurione(EscursioneDTO nuovaEscurione) {
		this.nuovaEscurione = nuovaEscurione;
	}


	public ArrayList<EscursioneDTO> getListaEscursioniFiltrate() {
		return listaEscursioniFiltrate;
	}


	public void setListaEscursioniFiltrate(
			ArrayList<EscursioneDTO> listaEscursioniFiltrate) {
		this.listaEscursioniFiltrate = listaEscursioniFiltrate;
	}


	public EscursioneDTO getDatiFiltro() {
		return datiFiltro;
	}


	public void setDatiFiltro(EscursioneDTO datiFiltro) {
		this.datiFiltro = datiFiltro;
	}


	public EscursioneDTO getEscursioneSelezionata() {
		return escursioneSelezionata;
	}


	public void setEscursioneSelezionata(EscursioneDTO escursioneSelezionata) {
		this.escursioneSelezionata = escursioneSelezionata;
	}


	public PacketBean getPackBean() {
		return packBean;
	}


	public void setPackBean(PacketBean packBean) {
		this.packBean = packBean;
	}



}
